package com.lj.utils.handler;

import com.lj.utils.exception.APIException;
import com.lj.utils.result.ResultCode;
import com.lj.utils.result.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 * 这里最好使用ResultVO返回（如果需要自定义也是如此）
 * 因为这里处理的返回会被RestControllerAdvice拦截，再进行封装到ResultVO，这样返回的状态码就是200 成功
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

//    @ExceptionHandler(value = ShiroException.class)
//    public ResultVO handler(ShiroException e){
//        log.error("Shiro异常");
//        return new ResultVO(ResultCode.UNAUTHORIZED, e.getMessage());
//    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResultVO handler(MethodArgumentNotValidException e){
        log.error("实体校验异常");
        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
        return new ResultVO(ResultCode.BAD_REQUEST, objectError.getDefaultMessage());
    }

    @ExceptionHandler(APIException.class)
    public ResultVO APIExceptionHandler(APIException e) {
        // 注意哦，这里返回类型是自定义响应体
        log.error("自定义异常");
        return new ResultVO(e.getCode(),e.getMsg(),null);
    }

    @ExceptionHandler(value = IllegalArgumentException.class)
    public ResultVO handler(IllegalArgumentException e){
        log.error("Assert异常");
        return new ResultVO<>(ResultCode.BAD_REQUEST,e.getMessage());
    }

//    @ExceptionHandler(value = Exception.class)
//    public ResultVO handler(Exception e){
//        log.error(e.getMessage());
//        return new ResultVO<>(ResultCode.BAD_REQUEST,e.getMessage());
//    }

}